var obj = {
    hi: function () {
        console.log(this, '--');
        return () => {
            console.log(this, '---');
        }
    },
    sayHi: function () {
        console.log(this, '--------')
        return function () {
            console.log(this);
            return () => {
                console.log(this);
            }
        }
    },
    say: () => {
        console.log(this);
    }
}
let hi = obj.hi();  //输出obj对象, obj.hi 返回的是还未执行的 ()=>{ console.log(this)}   obj.hi()() 会全部执行
hi();               //输出obj对象
let sayHi = obj.sayHi();   // 输出obj对象，因为隐式绑定
let fun1 = sayHi(); //输出window，隐式绑定丢失，采用默认绑定 指向 window 
fun1();             //输出window  箭头函数，this指向外层的this 也就是window
obj.say();          //输出window  箭头函数，this指向外层的this， 外层this就是全局指向window

// 箭头函数没有自己的this，箭头函数中的this继承于外层代码库中的this.

/* 
    obj.hi(); 对应了this的隐式绑定规则，this绑定在obj上，所以输出obj，很好理解。
    hi(); 这一步执行的就是箭头函数，箭头函数继承上一个代码库的this，刚刚我们得出上一层的this是obj，显然这里的this就是obj.
    执行sayHi();这一步也很好理解，我们前面说过这种隐式绑定丢失的情况，这个时候this执行的是默认绑定，this指向的是全局对象window.
    fun1(); 这一步执行的是箭头函数，如果按照之前的理解，this指向的是箭头函数定义时所在的对象，那么这儿显然是说不通。OK，按照箭头函数的this是继承于外层代码库的this就很好理解了。外层代码库我们刚刚分析了，this指向的是window，因此这儿的输出结果是window.
    obj.say(); 执行的是箭头函数，当前的代码块obj中是不存在this的，只能往上找，就找到了全局的this，指向的是window.

*/